<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型对象的作用</title>
    <script>
        class Person {
            constructor(a, b, c) {
                this.name = a
                this.age = b
                this.address = c
            }
            sayHello() {
                console.log('您好，我是', this.name)
            }
        }


        class P1 extends Person {
            constructor(a, b, c, d) {
                super(a, b, c)
                this.schoole = d
            }
            sayHello(){
                console.log('我毕业于', this.age)
            }
        }

        class P2 extends Person {
            constructor(a, b, c, d, e) {
                super(a, b, c)
                this.eyes = d
                this.gender = e
            }
            sayHello=()=>{
                console.log('我的眼睛是', this.eye)
            }
        }

        const people_1 = new P1('小李', 27, '甘肃天水', '南京工业大学')
        const people_1_1 = new P1('小萍', 28, '江苏南京', '南京工业大学')

        const people_2 = new P2('小龙', 27, '贵州铜仁', '黄色·', '女')

        console.log(people_1, people_2)

        // 所有的同类型对象，它们的原型都是同一个，也意味着同类型对象的原型链也一样
        console.log(Object.getPrototypeOf(people_1) === Object.getPrototypeOf(people_1_1))
        //P1-->Person实例-->object-->object的原型-->null
        console.log(P1.__proto__.__proto__.__proto__.__proto__)




        /*
            所有的同类型对象，它们的原型都是同一个

            原型的作用
                就相当于一个公共的区域，可以被所有的实例访问。
                可以将一个该类实例中，所有的公共属性（方法），统一存储到原型中，这样我们只需要创建一个属性，即可被所有的实例访问。

                JS中的继承就是通过原型来实现的。
                    当我们继承时，子类的原型就是父类的一个实例。

            在对象中，有些值是我们对象独有的，像（name,age,gender）这些，每个对象都应该有自己的值，但是有些值对于某些对象来说，都是一样的，对于这些值，没必要重复给每一个对象创建。
                 
        
        
        
        */
    </script>
</head>

<body>

</body>

</html>